#pragma once
#include "Common.hpp"

class CentralCache
{
public:
    // 提供一个单例的全局访问点
    static CentralCache *GetInstance() // 类内定义默认是内联函数
    {
        return &s_inst;
    }

    // 向CentralCache申请一批指定大小的内存块，start & end指向其头尾，返回值表示实际获取到的数量
    size_t FetchRangeObj(void *&start, void *&end, size_t size, size_t batchNum);

    // 从对应spanlist中找到一个有闲置空间的span并返回，如果没有则向PageCache申请页内存(span)，
    // 并将其分割成小块内存挂接到其freelist，最后将该span链入到对应spanlist
    Span *GetOneSpan(SpanList &list, size_t size);

    // 将ThreadCache归还的一批内存块重新挂接回各自所属的span，如果useCount减到0，则将该span继续释放给PageCache
    void ReleaseListToSpans(void *start, size_t size);

private:
    SpanList _spanLists[NFREELISTS];
    static CentralCache s_inst; // 单例模式(急切）：由类自己管理的静态对象

    CentralCache() = default;
    CentralCache(const CentralCache &) = delete;
    ~CentralCache() = default;
};